home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / PAS_0693 / HEAPHELP.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-30  |  3KB  |  81 lines

  1. {─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
  2. Msg  : 455 of 587
  3. From : Sepp Mayer                          2:246/36.0           03 Jun 93  16:51 
  4. To   : Ryan Brown                                                                
  5. Subj : Structure Too Large                                                    
  6. ────────────────────────────────────────────────────────────────────────────────
  7.     about: Structure too large ---
  8.  
  9.  RB> Help... I have an array of records. The highest I can get this array
  10.  RB> is to 700 records.. the record contains one string[10] and one
  11.  RB> string[72]. can anyone  tell me how to get thearray to 1000?
  12.  
  13.  Hello Ryan,
  14.  
  15.  The limit of your Data-Segment is 65 KByte.
  16.  A string[10] need 11 Byte Memory, A string[72] needs 73 Byte of Memory.
  17.  (The first Byte for the Length followed by the String itself)
  18.  So, one Record needs 84 Bytes in Memory. 
  19.  The Maximum with your Method is 781. 
  20.  781 * 84 = 65604.
  21.  
  22.  The solution:
  23.  
  24.  Use the Heap, dont store the Record in the Data-Segment (=DS), store only a
  25.  POINTER to it in the DS.
  26.  
  27.  A Little example:}
  28.  
  29.  program HeapTest;
  30.  
  31.  type
  32.    TStr10    = string[10];
  33.    TStr72    = string[72];
  34.    PAnyThing = ^TAnyThing;
  35.    TAnyThing = record
  36.      FieldOne : TStr10;
  37.      FieldTwo : TStr72;
  38.    end;
  39.  
  40.  var
  41.    AnyThing : array[1..1000] of PAnyThing;
  42.    CountOfAnyThing : integer;
  43.    i : integer;
  44.  
  45.  procedure AddAnyThing(One, Two : string); (* Adds a new AnyThing *)
  46.  begin
  47.    If CountOfAnyThing = 1000
  48.    then begin
  49.      WriteLn('Too many AnyThings');
  50.      Exit;
  51.    end;
  52.    Inc(CountOfAnyThing);
  53.    AnyThing[CountOfAnyThing] := New(PAnyThing);
  54.    AnyThing[CountOfAnyThing]^.FieldOne := Copy(One,1,10); (* See the ^ *)
  55.    AnyThing[CountOfAnyThing]^.FieldTwo .= Copy(Two,1,72); (* See the ^ *)
  56.  end;
  57.  
  58.  procedure RemoveAnyThing;   (* Removes the Last AnyThing *)
  59.  begin
  60.    if CountOfAnyThing = 0
  61.    then begin
  62.      WriteLn('There is no AnyThing');
  63.      Exit;
  64.    end;
  65.    Dispose(AnyThing[CountOfAnyThing]);
  66.    Dec(CountOfAnyThing);
  67.  end;
  68.  
  69.  begin
  70.    CountOfAnyThing := 0;                     (* Set Count to 0 *)
  71.    RemoveAnyThing;                           (* Only to show the Error *)
  72.    AddAnyThing('field1','field2');           (* Create a AnyThing *)
  73.    (* Whatever you want ... *)
  74.    for i := 1 to CountOfAnyThing do          (* At the End of the Programm *)
  75.      RemoveAnyThing;                         (* or when you dont need your *)
  76.  end.                                        (* array, remove it *)
  77.  
  78.  
  79.  It is a good Idea to free the Memory you catched with New, otherwise your
  80.  Computers Memory will shrink from run to run and at the end you have to
  81.  reboot your System.